package SpringAOP.entity;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author yanghl
 * @Description: 增强的类
 * @date 2022/9/17 17:45
 */
@Component
@Aspect  // 生成代理对象
public class UserProxy {

    /**
     * 相同切入点抽取
     */
    @Pointcut(value = "execution(* SpringAOP.entity.User.add(..))")
    public void pointDemo(){

    }

    /**
     * 前置通知
     */
    @Before(value = "pointDemo()")
    public void before(){
        System.out.println("before() 方法");
    }

    /**
     * 后置通知 被增强的方法执行之后执行
     */
    @After(value = "pointDemo()")
    public void after(){
        System.out.println("after() 方法");
    }

    /**
     * 返回通知 被增强的方法正常返回之后执行
     */
    @AfterReturning(value = "pointDemo()")
    public void AfterReturning(){
        System.out.println("AfterReturning() 方法");
    }
    /**
     * 异常通知 发生异常时执行
     */
    @AfterThrowing(value = "pointDemo()")
    public void AfterThrowing(){
        System.out.println("AfterThrowing() 方法");
    }
    /**
     * 环绕通知 被增强的方法执行之前和执行之后都会被执行
     */
    @Around(value = "pointDemo()")
    public void Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕之前");
        // 执行被增强的方法
        proceedingJoinPoint.proceed();
        System.out.println("环绕之后");
    }

}
